A seguir, será feita uma amostragem de 3% dos usuários. O que dará aproximadamente 1 milhão de linhas na tabela "ratings".

%load_ext pretty_jupyter

Importar Bibliotecas

import pandas as pd
import os
import numpy as np

Definir Diretório

os.chdir("C:/0.Projetos/5.Sistema_de_Recomendação_MovieLens_2")

Carregar Arquivos

movies = pd.read_csv("Datasets/0.Datasets_Originais/movies.csv")
ratings = pd.read_csv('Datasets/0.Datasets_Originais/ratings.csv')
#ratings = pd.read_csv('Data/Dataset_original/ratings.csv', sep=',', parse_dates=['timestamp'])
tags = pd.read_csv("Datasets/0.Datasets_Originais/tags.csv")
#tags = pd.read_csv("Datasets/0.Datasets_Originais/tags.csv",  sep=',', parse_dates=['timestamp'])
#NÃO SERÁ USADA
#links = pd.read_csv("Data/Dataset_original/links.csv")
genome_tags = pd.read_csv("Datasets/0.Datasets_Originais/genome-tags.csv")
genome_scores = pd.read_csv("Datasets/0.Datasets_Originais/genome-scores.csv")
movies.head()
movieId title genres
0 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
1 2 Jumanji (1995) Adventure|Children|Fantasy
2 3 Grumpier Old Men (1995) Comedy|Romance
3 4 Waiting to Exhale (1995) Comedy|Drama|Romance
4 5 Father of the Bride Part II (1995) Comedy
ratings.head()
userId movieId rating timestamp
0 1 1 4.0 1225734739
1 1 110 4.0 1225865086
2 1 158 4.0 1225733503
3 1 260 4.5 1225735204
4 1 356 5.0 1225735119
links.head()
movieId imdbId tmdbId
0 1 114709 862.0
1 2 113497 8844.0
2 3 113228 15602.0
3 4 114885 31357.0
4 5 113041 11862.0
tags.head()
userId movieId tag timestamp
0 10 260 good vs evil 1430666558
1 10 260 Harrison Ford 1430666505
2 10 260 sci-fi 1430666538
3 14 1221 Al Pacino 1311600756
4 14 1221 mafia 1311600746
genome_tags.head()
tagId tag
0 1 007
1 2 007 (series)
2 3 18th century
3 4 1920s
4 5 1930s
genome_scores.head()
movieId tagId relevance
0 1 1 0.03200
1 1 2 0.02225
2 1 3 0.07000
3 1 4 0.05900
4 1 5 0.12300

Amostragem da tabela ratings

Faremos uma amostragem de 3% dos usuários da tabela ratings e em seguida, vamos utilizá-la como referência na amostragem das outras tabelas.

# Amostragem com 3% dos IDs dos usuários
amostragem1 = np.random.choice(ratings['userId'].unique(),
                                size=int(len(ratings['userId'].unique()) * 0.03),
                                replace=False)
# Filtrar a tabela 'ratings' com os IDs selecionados
amostragem_ratings = ratings.loc[ratings['userId'].isin(amostragem1)]
# Filtrar a tabela 'ratings' com os IDs que NÃO foram selecionados
amostragem_ratings_complementar = ratings.loc[~ratings['userId'].isin(amostragem1)]
# Resumo da tabela com os IDs selecionados
print('Existem {} linhas , {} usuários e {} filmes'
    .format(len(amostragem_ratings),amostragem_ratings['userId'].nunique(),amostragem_ratings['movieId'].nunique()))
Existem 1028502 linhas , 9929 usuários e 26770 filmes
# Resumo da  tabela  com os IDs que NÃO foram selecionados
print('Existem {} linhas , {} usuários e {} filmes'
    .format(len(amostragem_ratings_complementar),amostragem_ratings_complementar['userId'].nunique(),amostragem_ratings_complementar['movieId'].nunique()))
Existem 32803660 linhas , 321046 usuários e 82777 filmes

Salvar a tabela

amostragem_ratings_complementar.to_pickle("Datasets/1.Datasets_Amostragem/amostragem_ratings_complementar.pickle", compression="gzip")
amostragem_ratings.to_pickle("Datasets/1.Datasets_Amostragem/amostragem_ratings.pickle", compression="gzip")
#amostragem_ratings= pd.read_pickle("Datasets/1.Datasets_Amostragem/amostragem_ratings.pickle", compression="gzip")
del ratings, amostragem_ratings_complementar

Amostragem da tabela movies

Para a amostragem da tabela movies, faremos um filtro nos userId da tabela rating.

movies.head(3)
movieId title genres
0 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
1 2 Jumanji (1995) Adventure|Children|Fantasy
2 3 Grumpier Old Men (1995) Comedy|Romance
# Selecionar os "movieId" da tabela "amostragem_ratings"
movieId = np.array(amostragem_ratings['movieId'])
# Filtrar os mesmo de IDs de "amostragem_ratings" na tabela "movies"
movies_amostragem = movies.loc[movies['movieId'].isin(movieId)]
movies_amostragem
movieId title genres
0 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
1 2 Jumanji (1995) Adventure|Children|Fantasy
2 3 Grumpier Old Men (1995) Comedy|Romance
3 4 Waiting to Exhale (1995) Comedy|Drama|Romance
4 5 Father of the Bride Part II (1995) Comedy
... ... ... ...
86397 288557 Initial D: Third Stage (2001) Action|Animation|Romance
86427 288647 Everybody's Oma (2022) Documentary
86435 288669 Insidious: The Red Door (2023) Horror|Mystery|Thriller
86439 288679 The Out-Laws (2023) Action|Comedy|Romance
86470 288761 Novalis - Die blaue Blume (1993) Drama

26770 rows × 3 columns

# Salvar a tabela "movies_amostragem"
movies_amostragem.to_pickle("Datasets/1.Datasets_Amostragem/movies_amostragem.pickle", compression="gzip")
del movies

Amostragem da tabela tags

tags.head()
userId movieId tag timestamp
0 10 260 good vs evil 1430666558
1 10 260 Harrison Ford 1430666505
2 10 260 sci-fi 1430666538
3 14 1221 Al Pacino 1311600756
4 14 1221 mafia 1311600746
amostragem_ratings.head()
userId movieId rating timestamp
213 5 47 5.0 1029389303
214 5 175 4.0 1029389417
215 5 257 4.0 1029389115
216 5 318 4.0 1029389280
217 5 319 4.0 1029389327
# Selecionar as colunas de interesse
amostragem_ratings1 = amostragem_ratings[['userId', 'movieId']]
# Filtrar a tabela "tags"
tags_amostragem = amostragem_ratings1.merge(tags, on=["movieId", "userId"], how="inner")
# Olhar a tabela criada
tags_amostragem 
userId movieId tag timestamp
0 134 89898 advertising 1521614243
1 134 89898 drugs 1521614238
2 134 89898 Russia 1521614240
3 134 182899 Action 1514209025
4 134 182899 Asia 1514209050
... ... ... ... ...
51294 330008 79091 nerds 1433358037
51295 330008 79091 supervillain 1433358009
51296 330008 81564 animation 1433357978
51297 330008 81564 funny 1433357989
51298 330008 81564 supervillain 1433357964

51299 rows × 4 columns

# Salvar a tabela
tags_amostragem.to_pickle("Datasets/1.Datasets_Amostragem/tags_amostragem.pickle", compression="gzip") 

Amostragem da tabela genome_tags

genome_tags.head(3)
tagId tag
0 1 007
1 2 007 (series)
2 3 18th century
# Selecionar as "tagId" que serão usadas no filtro
tag_array = np.array(tags_amostragem["tag"])
# Filtrar os "tag" da amostragem
genome_tags_amostragem = genome_tags.loc[genome_tags["tag"].isin(tag_array)]
# Olhar a tabela criada
genome_tags_amostragem
tagId tag
0 1 007
1 2 007 (series)
2 3 18th century
3 4 1920s
4 5 1930s
... ... ...
1123 1124 writing
1124 1125 wuxia
1125 1126 wwii
1126 1127 zombie
1127 1128 zombies

977 rows × 2 columns

# Salvar a tabela "genome_tags_amostragem"
genome_tags_amostragem.to_pickle("Datasets/1.Datasets_Amostragem/genome_tags_amostragem.pickle", compression="gzip")
del genome_tags

Amostragem da tabela genome_scores

genome_tags_amostragem = pd.read_pickle("Datasets/1.Datasets_Amostragem/genome_tags_amostragem.pickle", compression="gzip")
genome_scores.head(3)
movieId tagId relevance
0 1 1 0.03200
1 1 2 0.02225
2 1 3 0.07000
# Selecionar as "tagId" que serão usadas no filtro
tagId_array = np.array(genome_tags_amostragem["tagId"])
# Filtrar os "tagId" da amostragem
genome_scores_amostragem = genome_scores.loc[genome_scores["tagId"].isin(tagId_array)]
# Olhar a tabela criada
genome_scores_amostragem
movieId tagId relevance
0 1 1 0.03200
1 1 2 0.02225
2 1 3 0.07000
3 1 4 0.05900
4 1 5 0.12300
... ... ... ...
18472123 288167 1124 0.09875
18472124 288167 1125 0.02950
18472125 288167 1126 0.02275
18472126 288167 1127 0.11225
18472127 288167 1128 0.03025

15999352 rows × 3 columns

genome_scores_amostragem.to_pickle("Datasets/1.Datasets_Amostragem/genome_scores_amostragem.pickle", compression="gzip")

⚠ No próximo Notebook será utilizado os arquivos:

  • amostragem_rating
  • movies_amostragem
  • tags_amostragem
  • genome_tags_amostragem
  • genome_scores_amostragem